Mtodo para ejecutar STM32F4 Discovery desde RAM
====================================================

Este fichero describe los procedimientos necesarios
para poder ejecutar cdigo en la RAM de la placa
STM32F4 Discovery en lugar de usar la memoria Flash.

Crear un nuevo linker file STM32F407xG_RAM.ld
a partir del fichero original STM32F407xG.ld
Se halla en:
(CHIBIOS)\os\ports\GCC\ARMCMx\STM32F4xx\ld

Las modificaciones han de poner en RAM lo que antes se hallaba
en flash. Por ejemplo:

MEMORY
    {
    /*flash : org = 0x08000000, len = 1M
    ram : org = 0x20000000, len = 112k */
	flash : org = 0x20000000, len = 64k
	ram : org = 0x20010000, len = 48k
    ethram : org = 0x2001C000, len = 16k
    ccmram : org = 0x10000000, len = 64k
    }

Con ello en lugar de tener 1M de Flash y 112k de RAM
tendremos 64K de RAM de programa y 48k de RAM de datos.
Las memorias ethram y ccmram no las modificamos.

No hace falta modificar el resto del linker file.

Con ello ya puede recompilarse para el nuevo destino.

La configuracin de debug se puede hacer independiente
de si se ejecuta en flash o en ram:

Startup:
  Reset and delay (seconds): 3
  Halt no activado
  Initialization commands:
    set remotetimeout 20
    monitor reset init
    monitor sleep 200
    monitor halt 2000
    monitor sleep 200
  Load image:   Use proyect binary bin/ch.elf
  Load symbols: Use proyect binary bin/ch.elf
  Set Breakpoint at: main
  Resume activado
  Run commands:
    reset init

Para poder arrancar correctamente se deberian fijar los pines
BOOT0=BOOT1(PB2)="1" para hacer que la posicin 0x00000000
sea un alias de la posicin 0x20000000 en el momento de arrancar.
Con la configuracin normal de la placa la posicin 0x00000000
es un alias de la posicin 0x08000000 que corresponde al inicio
de la memoria Flash.

Para evitar usar BOOT0 y BOOT1 se puee indicar que la tabla 
de vectores se hallar en RAM en lugar de ROM mediante:

#define CORTEX_VTOR_INIT   0x20000000

Ello hace que el fichero chcore_v7m.c relocalice correctamente
los vectores despues de arrancar.

De esta manera no hace falta jugar con los pines BOOT0 y BOOT1
para poder ejecutar desde RAM

Tanto esta modificacion como el cambio de linker file se puede
hacer dentro del makefile:
---------------------------------------------------------------
# Define linker script file here 
# En aquest Makefile el linker file depen de si es compila a Flash o RAM
# Addicionalment aixo afecta a la posicio del vectors
ifeq ($(RAM_COMPILE),yes)
LDSCRIPT= $(PORTLD)/STM32F407xG_RAM.ld
CORTEX_VTOR_INIT = 0x20000000
else
LDSCRIPT= $(PORTLD)/STM32F407xG.ld
CORTEX_VTOR_INIT = 0x00000000
endif
.
.
.
# List all default C defines here, like -D_DEBUG=1
# Aadida una linea para configurar los vectores del procesador
DDEFS = -DCORTEX_VTOR_INIT=$(CORTEX_VTOR_INIT)
---------------------------------------------------------------

Con las configuraciones anteriores se ejecuta desde RAM pero
se genera un "Undefined Instruction" hard fault.

El problema se debe a que el puntero de pila MSP principal no se 
incializa correctamente.
El puntero de pila de proceso PSP si que se halla en la posicin correcta.

La pila MSP de incializa por hardware con el primer vector (posicin 0) 
de la tabla de vectores. 
El problema es que este vector no se puede incializar correctamente ya que
la tabla de vectores no es la correcta en el momento de arrancar puesto
que la tabla de vectores se mueve a la posicin 0x20000000 dentro
del fichero ChibiOS_2.6.2\os\ports\GCC\ARMCMx\chcore_v7m.c despus del arranque.

Para evitar necesitar usar los pines BOOT0 y BOOT1 se puede cambiar
el cdigo del fichero crt0.c de ChibiOS/RT de manera que se incialice MSP
en la misma zona de cdigo donde se incicializa el puntero PSP:

-----------------------------------------------------------
/* Process Stack initialization, it is allocated starting from the
   symbol __process_stack_end__ and its lower limit is the symbol
   __process_stack_base__.*/
asm volatile ("cpsid   i");
psp = SYMVAL(__process_stack_end__);
asm volatile ("msr     PSP, %0" : : "r" (psp));

// Aadimos el siguiente codigo:

/* Main Stack initialization, it is allocated starting from the
   symbol __main_stack_end__ and its lower limit is the symbol
    __main_stack_base__.*/
asm volatile ("cpsid   i");
msp = SYMVAL(__main_stack_end__);
asm volatile ("msr     MSP, %0" : : "r" (msp));
-----------------------------------------------------------

El Makefile necesario para incorporar todos estos cambios 
ha sufrido importantes modificaciones respecto de la version
que trabaja sobre Flash.

Es importante notar que todo este proceso introduce cambios dentro
de los directorios propios de ChibiOS/RT, en concreto:

 * Creacin del linker file 
   ChibiOS_2.6.2\os\ports\GCC\ARMCMx\STM32F4xx\ld\STM32F407xG_RAM.ld

 * Modificacin del fichero
   ChibiOS_2.6.2\os\ports\GCC\ARMCMx\crt0.c

Por tanto, si en algun momento del futuro se hace un upgrade del sistema
operativo se tendrn que implementar los cambios indicados.





